/*
 * Licensed to the 南京汇海交通科技有限公司
 *
 * Copyright (c) 2025.
 * All rights reserved.
 *
 * 本软件属南京汇海交通科技有限公司所有，在未获得南京汇海交通科技有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.chframework.common.exception;

import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONUtil;
import com.chframework.common.web.IApiResult;

/**
 * 数据源 - 外部接口或第三方平台API 异常类，不需要打印日志，将所有的异常信息抛到Service层统一处理
 * 使用方式：
 * try {
 *     // Client层代码
 * } catch (Exception e) {
 *     // 注意，在SystemMessageException的构造器改动之后，不再允许将后端异常消息反馈给客户端！
 *     throw new SystemMessageException(e.getMessage());
 * }
 */
public final class SystemMessageException extends IllegalArgumentException {

    /**
     * 直接将远程微服务接口响应报文返回
     * 在Spring-WebFlux工程中，当通过WebClient调用远程微服务接口时，
     * 如果响应报文内部的状态值不符合预期，那么则没有必要继续执行接下来的操作。
     * 这时，如果要求我们将真实的业务校验未通过的原因返回，
     * 就可以直接借助Mono.error()使用 SystemMessageException 帮助传递响应报文给到全局异常处理程序。
     * 在Service-Client层，对于运行时异常则应使用 ClientException 将异常堆栈信息在全局异常处理程序中打印出来。
     *
     * @param apiResult 为了最大程度地简化异常处理编码，如果想要将在项目中进行远程调用时返回的异常结果直接反馈给客户端，可以使用该异常类！
     */
    public SystemMessageException(IApiResult<?> apiResult) {
        super(toJson(apiResult), null);
    }

    static String toJson(IApiResult<?> apiResult) {
        JSONConfig jsonConfig = JSONConfig.create().setIgnoreNullValue(false);
        return JSONUtil.toJsonStr(apiResult, jsonConfig);
    }

}
